import { createApp } from 'vue';
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
import ElementPlus, { ElMessage } from 'element-plus'; // 导入ElMessage以供全局使用
import 'element-plus/dist/index.css';
import * as ElementPlusIconsVue from '@element-plus/icons-vue';
import zhCn from 'element-plus/es/locale/lang/zh-cn';

import App from './App.vue';
import router from '@/router';
import { useUserInfoStore } from "@/stores/userInfo";
import { getToken } from "@/utils/auth"; // 【重要】引入我们的Token工具

// 1. 创建 Vue 应用实例
const app = createApp(App);

// 2. 创建 Pinia 实例并注册持久化插件
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);

// 3. 注册核心插件 (必须在获取 store 实例之前)
app.use(pinia);
app.use(router);
app.use(ElementPlus, { locale: zhCn });

// 全局注册 Element Plus 图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component);
}

// 这个逻辑会在应用初始化时执行一次
// 它的作用是：检查本地是否存在Token，如果存在，就尝试用它去后端换取最新的用户信息
const initializeLoginState = async () => {
    // 必须在 app.use(pinia) 之后才能获取 store
    const userInfoStore = useUserInfoStore();
    const token = getToken();

    // 如果本地有 token，说明用户可能处于登录状态
    if (token && !userInfoStore.userInfo.id) {
        try {
            // 调用 store 中的 action 尝试自动登录
            // 这个 action 内部会调用 API，如果成功，所有用户信息和权限都会被更新
            console.log('检测到Token，正在尝试恢复登录会话...');
            await userInfoStore.fetchUserInfo();
        } catch (error) {
            // 如果 fetchUserInfo 失败 (比如token失效)，store内部或请求拦截器会处理后续逻辑
            // (例如清除无效token并跳转到登录页)
            console.error('会话恢复失败', error);
        }
    }
};

// 执行初始化逻辑，然后挂载应用
initializeLoginState().then(() => {
    app.mount('#app');
    console.log('应用已挂载。');
});
// -------------------- 【改造结束】 --------------------

window.addEventListener('offline', () => {
    const userInfoStore = useUserInfoStore();
    if (userInfoStore && typeof userInfoStore.logout === 'function') {
        userInfoStore.logout();
        ElMessage.warning('您已离线，将自动退出登录');
    }
});